// 接口


/*
 * 传入一个多余的字段age，ts是不会报错的，只要满足接口的必要条件，多余的值是被允许的，
 * 这里有一种例外情况，就是直接在render函数中传入一个对象子面量，绕过ts检查的方法有三种：
 * 1、将对象子面量传给一个变量，函数调用时，将这个变量作为参数，例如：let result = {};render(result);
 * 2、使用类型断言
 */

 interface List {
   id: number,
   name: string,
   age?: number | string
 }

 interface Result {
   data: List[]
 }

 function render(result: Result) {
  result.data.forEach(item => {
    console.log(item.id, item.name);
  })
 }

// 直接将对象字面量作为函数参数传递 ts会报错
 render({
  data: [
    {id: 0, name: "item-1"},
    // {id: 0, name: "item-1", age: '123'}, //代码会报错
    {id: 1, name: "item-2"},
    {id: 2, name: "item-3"},
  ]
})

// 将对象字面量赋值给一个变量，将变量作为参数传递
 let result = {
   data: [
     {id: 0, name: "item-1", age: '123'},
     {id: 1, name: "item-2"},
     {id: 2, name: "item-3"},
   ]
 }

render(result);

// 类型断言


// 可选属性 在属性后边加问好
render({
  data: [
    {id: 0, name: "testZhang", age: 23}
  ]
})

// 只读属性

interface Person {
  name: string,
  idCard: number,
  readonly age: number
}

let person: Person = {name: "zhang", idCard: 142601199305220433, age: 34};
person.name = "lisi";
// person.age = 23;
console.log(typeof person, person);

// 数组的只读属性
let arr: number[] = [1, 2, 3, 4];
let arr2: ReadonlyArray<number> = [6, 7, 8, 9];

arr[0] = 10;
console.log(arr, arr2);

// arr2[0] = 10 报错
// 使用类型断言重写arr2
let a = arr2 as number[]
a[0] = 10
console.log(a, "断言");